Clients 可以想像是提供客戶端一個可訪問鏈上的工具。
分為三類
先說明 Public Client
使用公共用戶端的 JSON-RPC-API 方法的介面
import
import { createPublicClient } from 'viem'
簡單的範例
import { createPublicClient, http } from 'viem'
import { mainnet } from 'viem/chains'
const client = createPublicClient({
chain: mainnet, // 設定 chain
transport: http(), // 選擇 http 或 webSocket
})
const blockNumber = await client.getBlockNumber() // 取得目前區塊號
優化:
試想一下我們在和鏈上互動時,都會需要使用 rpc 去互動,如果我們要呼叫很多合約方法就需要分別呼叫並多個 rpc 請求…如果又要及時更新的資料想必…請求量相當驚人,所以團隊對eth_call優化,有機會大家可以看一下這個 multicall3 內部就是使用這個。
以下用 USDT 得合約做範例
Address: 0xdAC17F958D2ee523a2206206994597C13D831ec7
abi: https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#code
import { createPublicClient, http } from 'viem';
import { mainnet } from 'viem/chains';
import { getContract } from 'viem';
const client = createPublicClient({
batch: {
multicall: true, // 批次處理
batchSize: 10, // 呼叫資料大小限制
wait: 16, //批次處理等待最大延遲(毫秒數)
cacheTime: 10_000, // 快取時間
},
chain: mainnet, // 設定 chain
transport: http(), // 選擇 http 或 webSocket
});
const contract = getContract({
address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
abi: [], //... 可以到上列地址複製
chain: mainnet,
publicClient: client,
});
contract.read.name().then(console.log);
// await
const [name, totalSupply, symbol] = await Promise.all([
contract.read.name(),
contract.read.totalSupply(),
contract.read.symbol(),
]);
console.log(name, totalSupply, symbol);
大家可以感受看看 multicall: true,false的差別
我感覺是我的使用場景不夠複雜比較沒感受,但有做出來這功能就可以試試。
實作範例:
https://github.com/0xRory/ITHepleViem/blob/main/examples/2_1_public.js
參考:
https://viem.sh/docs/clients/public.html